package com.hzg.springcloud.filter;

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import org.springframework.cloud.netflix.zuul.filters.support.FilterConstants;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;

import javax.servlet.http.HttpServletRequest;
import java.io.IOException;

/**
 * 鉴权拦截器 :
 * 做登陆判断操作,如果带了 token 表示要进行登陆鉴权,没有 token表示直接放行
 * 现在的 filter 不是 Web 项目的filter ,而是内网关自带的
 */
//@Component
public class AuthZuulFilter extends ZuulFilter {

    //指定是前置过滤器
    @Override
    public String filterType() {
        //FilterConstants 网关的过滤器,默认的字段
        return FilterConstants.PRE_TYPE;
    }

    //定义过滤器优先级，越小越优先级越高
    //过滤器的序号(优先级) 0~10
    @Override
    public int filterOrder() {
        return 1;
    }

    //指定穿过zuul网关的请求过滤规则，true表示当前请求满足拦截条件
    //是否执行鉴权过滤,true 表示当前请求要执行鉴权操作,false 表示当前请求不执行鉴权操作
    @Override
    public boolean shouldFilter() {
        //做登陆判断操作,如果带了 token 表示要进行登陆鉴权,没有 token表示直接放行---->约定
        //获取请求方式     getCurrentContext: 获取当前的请求上下文
        RequestContext requestContext = RequestContext.getCurrentContext();
        //获取请求对象
        HttpServletRequest request = requestContext.getRequest();
        String token = request.getHeader("token");
        //如果有 那么往下走,没有就 直接放行
        return StringUtils.hasLength(token);
    }

    //执行前提 : 当shouldFilter为true，执行该方法
    //表示实现过滤拦截逻辑
    //鉴权的操作逻辑
    @Override
    public Object run() throws ZuulException {
        //获取请求方式     getCurrentContext: 获取当前的请求上下文
        RequestContext requestContext = RequestContext.getCurrentContext();
        //获取请求对象
        HttpServletRequest request = requestContext.getRequest();

        //执行 token 鉴权
        System.out.println("执行 token 鉴权 ....");

        //不放行不转发   我不让他走了,到这里就截止了
        requestContext.setSendZuulResponse(false);

        //设置响应状态码    HttpStatus 返回的状态码 现在是 401
        requestContext.setResponseStatusCode(HttpStatus.UNAUTHORIZED.value());
        try {
            //返回的内容
            requestContext.getResponse().getWriter().write("no unauthorized");
        } catch (IOException e) {
            e.printStackTrace();
        }

        //如果想继续往下走,那么就传数据,不需要那么就null
        return null;
    }
}